#include <QMenuBar>
#include <QAction>
#include <QRegExpValidator>
#include <QRegExp>
#include <QtDebug>

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "file_manager.h"
#include "frequency_information_model.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , manager_(new File_manager())
    , model_(new Frequency_information_model(this))
{
    ui->setupUi(this);

    setup_actions();
    setup_attributes();
    setup_connections();
    setup_menus();

    // 正则表达式，用户只能输入“.”和数字
    ui->line_input_frequency->setValidator(new QRegExpValidator(QRegExp("[0-9.0-9]*")));

    ui->tableview_station_->setModel(model_);

//    int width = sizeHint().width();
//    int height = sizeHint().height();
//    setFixedSize(width, height);
}

MainWindow::~MainWindow()
{
    delete ui;
    delete model_;
    delete manager_;
}

void MainWindow::setup_actions()
{
    open_action_ = new QAction(tr("Open"), this);
    exit_action_ = new QAction(tr("Exit"), this);
}

void MainWindow::setup_attributes()
{
}

void MainWindow::setup_connections()
{
    // 打开对话框，读取台站信息
    connect(open_action_,
            static_cast<void (QAction::*)(bool)>(&QAction::triggered),
            this,
            &MainWindow::open_dialog);

    // 关闭程序
    connect(exit_action_,
            &QAction::triggered,
            qApp,
            &QApplication::closeAllWindows);

    // 点击按钮，进行三阶互调计算
    connect(ui->button_analyse_,
            &QPushButton::clicked,
            this,
            &MainWindow::calculate_frequency);

    // 向this返回打开文件后读取的数据项
//    connect(manager_, &File_manager::signal_frequency_informations,
//            this, &MainWindow::set_model_and_view);

    // 根据从txt文档中读取的台站信息保存到model模型中
    connect(manager_,
            &File_manager::signal_frequency_informations,
            this,
            &MainWindow::set_informations_list_in_model_view);

    // 向this返回接收的台站名称
    connect(manager_,
            &File_manager::signal_station_name,
            this,
            &MainWindow::setup_station_name);

    // 向this返回互调计算后的台站频率信息
    connect(manager_,
            &File_manager::signal_informations_to_model_view,
            this,
            &MainWindow::set_informations_list_in_model_view);
}

void MainWindow::setup_menus()
{
    file_menu_ = menuBar()->addMenu(tr("File"));
    file_menu_->addAction(open_action_);
    file_menu_->addSeparator();
    file_menu_->addAction(exit_action_);
}

void MainWindow::set_model_and_view(QList<Information*>* list)
{
    model_->set_informations_list(list);

    ui->tableview_station_->setModel(model_);

    if (list) {
        ui->button_analyse_->setEnabled(true);
    }
}

void MainWindow::open_dialog()
{
    // 单线程处理
//    set_model_and_view(manager_->create_dialog(this, ui->label_station_name_, tr("打开文件")));

    // 多线程处理
//    set_model_and_view(manager_->get_dialog_multithread(this, tr("打开文件")));
    // 多线程处理，通过信号槽在
    manager_->open_dialog_for_read_file_in_multithread(this, tr("打开文件"));
}

void MainWindow::calculate_frequency()
{
    qDebug()<< "MainWindow::calculate_frequency : " << QThread::currentThreadId();
    bool flag(false);

    double frequency = ui->line_input_frequency->text().trimmed().toDouble(&flag);

    // true 用户输入数据为double类型；false 用户输入类型错误或未输入
    if ( flag) {
        model_->reset_model_data();
        QList<Information*>* list = model_->get_informations_list();

        // 根据频率和台站信息计算是否有互调
//        if (manager_->calculate_frequency(frequency, list)) {
//            model_->set_informations_list(list);
//        }

        // 根据输入频率和台站信息计算是否有互调
        manager_->calculate_frequency_in_multithread(frequency, list);
    } else {
        model_->reset_model_data();
        model_->set_informations_list(model_->get_informations_list());
    }
}

void MainWindow::set_informations_list_in_model_view(QList<Information*>* list)
{
    model_->set_informations_list(list);

    ui->tableview_station_->setModel(model_);

    if (list) {
        ui->button_analyse_->setEnabled(true);
    } else {
        ui->button_analyse_->setEnabled(false);
    }
}

void MainWindow::setup_station_name(QString station_name)
{
    ui->label_station_name_->setText(station_name);
}
